package com.itcam;

import com.itcam.bean.Cat;
import com.itcam.bean.Dog;
import com.itcam.bean.Pig;
import com.itcam.bean.Sheep;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * 1.标识环境
 *  1).区分出几个环境：dev（开发环境）、test（测试环境）、prod（生产环境）
 *  2).指定每个组件在哪个环境下生效，default：默认环境
 *      通过：@Profile({"test"})标注
 *      组件没有标注@Profile代表任意时候都生效
 *  3).默认只有激活指定的环境，这些组件才会生效
 * 2.激活环境
 *  配置文件激活：spring.profile.active=dev
 *  命令行激活：java -jar xxx.jar --spring.profile.active=dev
 * 3.配置文件怎么使用Profile功能
 *  1).application.properties : 主配置文件。任何情况下都生效
 *  2).其他Profile环境的命名规范： application-{profile标识}.properties/yaml
 *      比如：application-dev.properties/yaml
 *  3).激活指定环境即可：配置文件激活、命令行激活
 *  4).效果：
 *      项目的所有生效配置项 = 激活环境配置文件的所有项 + 主配置文件和激活文件不冲突的所有项
 *      如果发送了配置冲突，以激活的环境配置文件为准
 *      application-{profile标识}.properties 优先级大于 application.properties
 *
 * todo:主配置文件和激活的配置文件都生效，以激活的配置文件为主
 */
@Slf4j
@SpringBootApplication
public class Boot07FeaturesApplication {

    public static void main(String[] args) {
        // SpringApplication : Boot应用的核心API入口
//        SpringApplication.run(Boot07FeaturesApplication.class, args);

        // 1.自定义SpringApplication的底层设置
//        SpringApplication springApplication = new SpringApplication(Boot07FeaturesApplication.class);
//        // properties优先级比自定义SpringApplication的高
//        // 配置文件的优先级高于程序化调整的优先级
//        springApplication.setBannerMode(Banner.Mode.CONSOLE);
//        springApplication.run(args);

        // 2.Builder方式构建SpringApplication
        ConfigurableApplicationContext context = new SpringApplicationBuilder()
                .main(Boot07FeaturesApplication.class)
                .sources(Boot07FeaturesApplication.class)
                .bannerMode(Banner.Mode.CONSOLE)
//                .environment(null)
//                .listeners(null)
                .run(args);

        try {
            Cat cat = context.getBean(Cat.class);
            log.info("组件cat:{}", cat);
        } catch (Exception e) {

        }

        try {
            Dog dog = context.getBean(Dog.class);
            log.info("组件dog:{}", dog);
        } catch (Exception e) {

        }

        try {
            Pig pig = context.getBean(Pig.class);
            log.info("组件pig:{}", pig);
        } catch (Exception e) {

        }

        try {
            Sheep sheep = context.getBean(Sheep.class);
            log.info("组件sheep:{}", sheep);
        } catch (Exception e) {

        }


    }

}
